#include <iostream>
#include <future>
#include <thread>

#include <unistd.h>

int main()
{
    // 使用 packaged_task,可以当成函数执行，也可以由线程启动
    std::packaged_task<int()> task([]() {
        std::cout << "packaged_task started" << std::endl;
        sleep(10);
        return 7; }); // wrap the function
    std::future<int> f1;
    std::cout << f1.valid() << std::endl;
    f1 = task.get_future();  // get a future
    std::cout << f1.valid() << std::endl;
    //f1.wait();
    task(); // launch on a thread

    // 使用 async()
    std::future<int> f2 = std::async(std::launch::deferred, []() {
        std::cout << "Async task started" << std::endl;
        return 8; });

    // 使用 promise
    std::promise<int> p;
    std::future<int> f3 = p.get_future();
    std::thread([&p] { p.set_value_at_thread_exit(9); }).detach();

    f1.wait();
    f2.wait();
    f3.wait();
    std::cout << "Done!\nResults are: "
        << f1.get() << ' ' << f2.get() << ' ' << f3.get() << '\n';
}
